iT邦幫忙

2022 iThome 鐵人賽

DAY 9
0
Software Development

Backend Developer roadmap study系列 第 9

[day9] 帳戶登入授權機制之前端與後端交互

  • 分享至 

  • xImage
  •  

cookie authorization

在運用cookie情況下,使用者在登入伺服器後,伺服器會在後端生成一串unique的token,並且回傳給使用者,使用者在每次發送request給後端時cookie都會帶token一起發送到後端,後端會根據token返回權限,以下將介紹user登入後端運用cookie生成token的過程為何。

  1. 使用者發出request給後端要求註冊帳號
  2. 後端將密碼透過hash加密,並且儲存於database
  3. 使用者在發出登入request給後端要求登入
  4. 後端會在透過hash加密使用者密碼後比對database裡帳戶資訊,如果相同則升成一串token儲存於database並且返回cookie給前端,此token會帶有效時限
  5. 此後前端發出每個request都會帶著cookie資訊給後端,如果token過期,比對token失敗後則會拒絕訪問

JWT(JSON Web Token)介紹

為restapi的其中一種架構機制,在使用者透過JWT對後端請求資源,後端會驗證此JWT的資訊是否有效返回對應內容給前端。
JWT由三個部分所組成Header、Payload、Signature所組成

  • Header: 通常由演算法加密,Token類型所組成的JSON,之後會在經由Base64 URL編碼
  • Payload: 放置要傳給後端的資料
  • Signature: Header(base64後)、Payload(base64後)、secret

OAuth2.0

OAuth2.0為使用第三方授權登入應用程式,此時應用程式從第三方業者取得基本用戶資料,使用者就不需要使用帳密登入伺服器,假設今天進入hackmd透過google帳號登入,詳細流程後面會介紹,這裡先介紹OAuth2.0常見名詞

  • Resource Owner: 這裡指使用者,指擁有決定給予權限與否的使用者
  • Resource Server: 這裡擁有帳戶資訊的伺服器端,如上述google
  • Client: 指第三方應用程式如上述hackmd
  • Authorization Server: 驗證Resource Owner身分,同意後會發放token給第三方伺服器,並同意使用者的登入

  1. 首先點擊Client登入會導到Authorization Server,使用者可以選擇要授權給Client的資訊,常見如: Client Id、Redirect URI、Response Type、Scope
  2. Authorization Server進行身分驗證後,會根據剛剛設定的scope,確認是否同意授權,會明確標示要授權的資訊,如:名稱、email等等
  3. 同意授權後會導向Redirect URI,並且將token以及相關資訊透過前面設定的Response Type回覆Authorization grant給使用者
  4. Client端獲得Authorization grant後,會拿著他再向Authorization Server要求token,Authorization Server會在此驗證資訊以及Client身分後核發token
  5. 最終使用者帶著此token向Client發送request,此時Client也只會取得使用者授權的資訊

OpenID

上面提到的OAuth2.0只有提供登入授權,OIDC(OpenID Connection)目的是認證(Authentication),OAuth2.0目的則是授權(Authorization),並擴充了在OAuth2.0不足的機制

  • ID Token:認證所需的用戶資訊,這是 OIDC 最重要的擴充。不要和 OAuth 2.0 的 Access Token 攪混了,Access Token 是用於授權,不帶有用戶資訊來做認證。
  • UserInfo Endpoint:除了上面 ID Token 提供基本用戶資訊,OIDC 還規定認證提供者應提供一個 API 界面,讓 Client 能取的更完整的用戶資訊。
  • Standard Set of Scopes:OAuth 2.0 沒有定義 scope(忘記這是什麼了嗎?先回去看一下前一篇文章吧!),造成 Facebook 可能有 Facebook 的 scope,Google 有 Google 的 scope,實做的時候必須參閱各家的手冊客製化。OIDC 規範了共通的 scope 讓大家有規可循。詳細規範可以參考文件。


流程圖將 OIDC 變動的部份醒目標示。第一個變化是第 2 步在要求 Authorization Code 的時候,scope 新增了 openid 值。

第二個不一樣的地方,是第 8 步在換 Access Token 的時候,除了取得 Access Token,還取得了 ID Token。這是因為前面的scope 有指定 openid ,讓 Client 有取得 ID Token 的權限。

最後的差異是第 10 步。先前 OAuth 2.0 的流程在取得授權後是去存取用戶持有的資源(用戶的照片、文件等等),但 OIDC 的目的是認證。這邊是從 OIDC UserInfo Endpoint 取得認證所需的用戶資訊,來完成註冊的流程。

SALM

SALM透過http傳送經由base64編碼過後的xml文件,其中會包含使用者的認證(Authentication)與授權(Authorization)相關的資訊,其好處為保密性更高,其概念如同上述儲存在cookie authorization機制,因此詳細內需探討實作。

參考


上一篇
[day8] 分散式系統設計問題
下一篇
[day10] 常見傳輸協定
系列文
Backend Developer roadmap study30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言